package org.g4studio.core.net;

import java.util.EventObject;

/***
 * There exists a large class of IETF protocols that work by sending an ASCII
 * text command and arguments to a server, and then receiving an ASCII text
 * reply. For debugging and other purposes, it is extremely useful to log or
 * keep track of the contents of the protocol messages. The ProtocolCommandEvent
 * class coupled with the {@link org.apache.commons.net.ProtocolCommandListener}
 * interface facilitate this process.
 * <p>
 * <p>
 * 
 * @see ProtocolCommandListener
 * @see ProtocolCommandSupport
 * @author Daniel F. Savarese
 ***/

public class ProtocolCommandEvent extends EventObject {
	private int __replyCode;
	private boolean __isCommand;
	private String __message, __command;

	/***
	 * Creates a ProtocolCommandEvent signalling a command was sent to the
	 * server. ProtocolCommandEvents created with this constructor should only
	 * be sent after a command has been sent, but before the reply has been
	 * received.
	 * <p>
	 * 
	 * @param source
	 *            The source of the event.
	 * @param command
	 *            The string representation of the command type sent, not
	 *            including the arguments (e.g., "STAT" or "GET").
	 * @param message
	 *            The entire command string verbatim as sent to the server,
	 *            including all arguments.
	 ***/
	public ProtocolCommandEvent(Object source, String command, String message) {
		super(source);
		__replyCode = 0;
		__message = message;
		__isCommand = true;
		__command = command;
	}

	/***
	 * Creates a ProtocolCommandEvent signalling a reply to a command was
	 * received. ProtocolCommandEvents created with this constructor should only
	 * be sent after a complete command reply has been received fromt a server.
	 * <p>
	 * 
	 * @param source
	 *            The source of the event.
	 * @param replyCode
	 *            The integer code indicating the natureof the reply. This will
	 *            be the protocol integer value for protocols that use integer
	 *            reply codes, or the reply class constant corresponding to the
	 *            reply for protocols like POP3 that use strings like OK rather
	 *            than integer codes (i.e., POP3Repy.OK).
	 * @param message
	 *            The entire reply as received from the server.
	 ***/
	public ProtocolCommandEvent(Object source, int replyCode, String message) {
		super(source);
		__replyCode = replyCode;
		__message = message;
		__isCommand = false;
		__command = null;
	}

	/***
	 * Returns the string representation of the command type sent (e.g., "STAT"
	 * or "GET"). If the ProtocolCommandEvent is a reply event, then null is
	 * returned.
	 * <p>
	 * 
	 * @return The string representation of the command type sent, or null if
	 *         this is a reply event.
	 ***/
	public String getCommand() {
		return __command;
	}

	/***
	 * Returns the reply code of the received server reply. Undefined if this is
	 * not a reply event.
	 * <p>
	 * 
	 * @return The reply code of the received server reply. Undefined if not a
	 *         reply event.
	 ***/
	public int getReplyCode() {
		return __replyCode;
	}

	/***
	 * Returns true if the ProtocolCommandEvent was generated as a result of
	 * sending a command.
	 * <p>
	 * 
	 * @return true If the ProtocolCommandEvent was generated as a result of
	 *         sending a command. False otherwise.
	 ***/
	public boolean isCommand() {
		return __isCommand;
	}

	/***
	 * Returns true if the ProtocolCommandEvent was generated as a result of
	 * receiving a reply.
	 * <p>
	 * 
	 * @return true If the ProtocolCommandEvent was generated as a result of
	 *         receiving a reply. False otherwise.
	 ***/
	public boolean isReply() {
		return !isCommand();
	}

	/***
	 * Returns the entire message sent to or received from the server.
	 * <p>
	 * 
	 * @return The entire message sent to or received from the server.
	 ***/
	public String getMessage() {
		return __message;
	}
}
